package thaw.plugins.queueWatcher; import java.awt.Component; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.dnd.DnDConstants; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.DragGestureListener; import java.awt.dnd.DragSource; import java.awt.dnd.DragSourceContext; import java.awt.dnd.DragSourceDragEvent; import java.awt.dnd.DragSourceDropEvent; import java.awt.dnd.DragSourceEvent; import java.awt.dnd.DragSourceListener; import java.io.File; import java.util.Iterator; import java.util.Vector; import thaw.core.Core; import thaw.core.Logger; import thaw.fcp.FCPTransferQuery; /** * TODO : WIP ! * @author jflesch */ public class DragAndDropManager implements DragGestureListener, DragSourceListener { private QueuePanel[] queuePanels; // private DragSource dragSource; private final String tmpDir = System.getProperty("java.io.tmpdir"); public DragAndDropManager(final Core core, final QueuePanel[] queuePanels) { this.queuePanels = queuePanels; //dragSource = DragSource.getDefaultDragSource(); //for(int i = 0 ; i < queuePanels.length ; i++) { //dragSource.createDefaultDragGestureRecognizer(queuePanels[i].getTable(), // DnDConstants.ACTION_COPY_OR_MOVE, // this); /* TODO: Finish DnD support */ //queuePanels[i].getTable().setTransferHandler(new FileTransferHandler()); //queuePanels[i].getTable().setDragEnabled(true); //} } /*private class FileTransferHandler extends TransferHandler { private static final long serialVersionUID = 1L; protected Transferable createTransferable(final JComponent c) { if(c == queuePanels[0].getTable()) { queuePanels[0].reloadSelections(); return new DragableFinishedTransfers(queuePanels[0].getSelectedQueries(), false); } if(c == queuePanels[1].getTable()) { queuePanels[1].reloadSelections(); return new DragableFinishedTransfers(queuePanels[1].getSelectedQueries(), true); } return null; } }*/ public void dragGestureRecognized(final DragGestureEvent dge) { try { Transferable transferable; transferable = getTransferableFor(dge.getComponent()); dge.startDrag(DragSource.DefaultCopyDrop, transferable); } catch(final java.awt.dnd.InvalidDnDOperationException e) { Logger.warning(this, "InvalideDnDOperation !"); } } private class DragableFinishedTransfers implements Transferable{ public final DataFlavor[] FLAVORS = { DataFlavor.javaFileListFlavor, DataFlavor.stringFlavor, }; private Vector queries; /* FCPTransferQuery */ private boolean insert; public DragableFinishedTransfers(final Vector queries, final boolean insert) { if((queries == null) || (queries.size() <= 0)) { Logger.warning(this, "Selection null ?!"); } this.queries = queries; this.insert = insert; } public Object getTransferData(final DataFlavor flavor) { if((flavor == DataFlavor.javaFileListFlavor) || flavor.equals(DataFlavor.javaFileListFlavor) ) { final Vector fileList = new Vector(); for(final Iterator queryIt = queries.iterator(); queryIt.hasNext();) { final FCPTransferQuery query = (FCPTransferQuery)queryIt.next(); if(!query.isFinished() || !query.isSuccessful()) continue; if(query.getPath() == null) // We need a path ! query.saveFileTo(tmpDir); fileList.add(new File(query.getPath())); } return fileList; } if((flavor == DataFlavor.stringFlavor) || flavor.equals(DataFlavor.stringFlavor) ) { String result = ""; for(final Iterator queryIt = queries.iterator(); queryIt.hasNext();) { final FCPTransferQuery query = (FCPTransferQuery)queryIt.next(); if(!query.isFinished() || !query.isSuccessful()) continue; if(query.getPath() == null) // We need a path ! continue; if(!insert) result = result +query.getPath()+"\n"; else result = result + query.getFileKey() + "\n"; } return result; } return null; } public DataFlavor[] getTransferDataFlavors() { return FLAVORS; } public boolean isDataFlavorSupported(final DataFlavor flavor) { for(int i = 0 ; i < FLAVORS.length ; i++) if((FLAVORS[i] == flavor) || FLAVORS[i].equals(flavor)) return true; return false; } } private Transferable getTransferableFor(final Component c) { if(c == queuePanels[0].getTable()) { queuePanels[0].reloadSelections(); return new DragableFinishedTransfers(queuePanels[0].getSelectedQueries(), false); } if(c == queuePanels[1].getTable()) { queuePanels[1].reloadSelections(); return new DragableFinishedTransfers(queuePanels[1].getSelectedQueries(), true); } return null; } public void dragEnter(final DragSourceDragEvent e) { final DragSourceContext context = e.getDragSourceContext(); //intersection of the users selected action, and the source and target actions final int myaction = e.getDropAction(); if( (myaction & DnDConstants.ACTION_COPY) != 0) { context.setCursor(DragSource.DefaultCopyDrop); } else { context.setCursor(DragSource.DefaultCopyNoDrop); } } public void dragOver(final DragSourceDragEvent e) { } public void dragExit(final DragSourceEvent e) { } public void dragDropEnd(final DragSourceDropEvent e) { } public void dropActionChanged (final DragSourceDragEvent e) { } }